//
//  HomeTableViewController.swift
//  WeoboWithSteveLi
//
//  Created by SteveLi on 2017/9/18.
//  Copyright © 2017年 李军桦. All rights reserved.
//

import UIKit
import SVProgressHUD
/// 原创 微博cell的可重用表示符号
let StatusCellNormalId = "StatusCellNormalId"
///转发微博的可重用 ID
let StatusCellRetweetedId = "StatusCellRetweetedId"
class HomeTableViewController: VisitorTableViewController {
    /// 微博的数据列表模型
    lazy var listViewModel = StatusListViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        if !UserAccountViewModel.sharedUserAccount.userLogon {
            visitorView?.setupInfo(imageName: nil, title: "关注一些人，回这里看看有什么惊喜")
            return
        }
        prepareTableView()
        loadData()

    }
    /// 准备表格
    func prepareTableView() {
        /// 注册可重用 cell
        tableView.register(StatusNormalCell.self, forCellReuseIdentifier: StatusCellNormalId)
        tableView.register(StatusRetweetedCell.self, forCellReuseIdentifier: StatusCellRetweetedId)
        //取消分隔线
        tableView.separatorStyle = .none
        //自动计算行高 -需要一个自上而下的自动布局的控件，指定一个向下的约束
        tableView.estimatedRowHeight = 400
        //下拉刷新控件默认没有 -- 高度60
        //refreshControl = UIRefreshControl()
        refreshControl = WBRefreshControl()
        //添加监听方法
        refreshControl?.addTarget(self, action:#selector(loadData), for: UIControlEvents.valueChanged)
        //上拉刷新视图
        tableView.tableFooterView = pullupView
    }
    
  @objc  func loadData() {
          refreshControl?.beginRefreshing()
          listViewModel.loadStatus(isPullup:pullupView.isAnimating ) { (isSuccessed) in
            //关闭刷新控件
            self.refreshControl?.endRefreshing()
            //关闭上拉刷新
            self.pullupView.stopAnimating()
            if !isSuccessed{
                SVProgressHUD.showInfo(withStatus: "加载数据错误,请稍后再试")
                return
            }
           // print(self.listViewModel.statusList)
            //刷新数据
            self.tableView.reloadData()
        }
    }
    //MARK： -懒加载控件
    ///上拉刷新提示视图
    lazy var pullupView: UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.white)
        indicator.color = UIColor.lightGray
        return indicator
    }()
}

//MARK: --数据源方法
extension HomeTableViewController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //TODO: - 修改可重用标识符号
        //1.获取视图模型
        let vm = listViewModel.statusList[indexPath.row]
        
        //2.获取可重用cell
        
        let cell = tableView.dequeueReusableCell(withIdentifier: vm.cellId, for: indexPath) as! StatusCell
        //3.设置视图模型
        cell.viewModel = listViewModel.statusList[indexPath.row]
        //4.判断是否是最后一条微博
        if indexPath.row == listViewModel.statusList.count - 1 && !pullupView.isAnimating {
            //开始动画
            pullupView.startAnimating()
            //上拉属性数据
            loadData()
            print("上拉刷新")
        }
        return cell
    }
    /*
     行高
     ----设置了预估行高
         每个版本的xcode调用次数可以不同
     1.使用预估行高,计算出预估的contentSize
     2.根据预估行高，判断计算次数，顺序计算每一行的行高，更新contentSize
     3.如果预估行高过大，超出预估范围，顺序计算后续行高，一直到填满屏幕退出，同时更新contentSize
     4.使用预估行高,每个cell的显示需要及时，单个的效率是低的，从整体效率高
     ----没有设置行高
         计算所有行的高度
         在计算显示行的高度
     问题：为什么要调用所有的行高方法？ UITableView 继承UIScrollView
         表格视图滚动非常流畅 -> 需要提前计算出contentSize
     苹果官方文档指出，如果行高是固定值，就不会实现行高代理方法
    */
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return listViewModel.statusList[indexPath.row].rowHeight
    }
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //print("选中行\(indexPath)")
    }
    
}

